package org.online.test;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.online.entity.Product;
import org.online.utils.C3P0Util;

import java.sql.SQLException;
import java.util.List;

public class MainTest03 {
    // 添加
    private static void testInsert() throws SQLException{
        // 第一：通过C3P0/DBCP获取数据源对象 -- C3P0Util
        // 第二：创建QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()) ;
        // 第三：定义要操作的SQL语句
        String sql = "insert into product(product_id,product_name,product_price,product_count,product_image,product_desc) values (?,?,?,?,?,?)" ;
        // 第四：定义SQL语句需要的具体数据
        Object[] params = {"170","170商品",100,44,"170.png","GOOD GOOD"} ;
        // 第五：执行SQL语句
        // 查询操作：query(...) ;
        // 更新操作：update() ;
        int r = qr.update(sql, params);

        System.out.println(r);
    }

    // 根据ID查询 - 返回唯一一个对象或null - BeanHandler
    private static void testQueryById() throws SQLException{
        // 第一：通过C3P0/DBCP获取数据源对象 -- C3P0Util
        // 第二：创建QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()) ;

        // 第三：定义要操作的SQL语句  -- 使用别名解决实体对象属性名和数据表字段名不一致的问题
        String sql = "select product_id as id,product_name as name,product_price as price,product_count as count,product_image as image,product_desc as `desc` from product where product_id=?" ;

        // 第四：定义SQL语句需要的具体数据
        Object[] params = {"170"} ;
        String id="170" ;

        // 第五：执行SQL语句 - 反射、封装处理...
        // 查询操作：query(...) ;
        // 更新操作：update() ;
        Product p = qr.query(sql,new BeanHandler<Product>(Product.class),"171");


        System.out.println(p);
    }

    // 统计记录数 - 返回单行单列的数据 - ScalarHandler
    private static void testCount() throws SQLException{
        // 第一：通过C3P0/DBCP获取数据源对象 -- C3P0Util
        // 第二：创建QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()) ;

        // 第三：定义要操作的SQL语句  -- 使用别名解决实体对象属性名和数据表字段名不一致的问题
        String sql = "select count(product_id) from product" ;

        // 第四：定义SQL语句需要的具体数据

        // 第五：执行SQL语句 - 反射、封装处理...
        // 查询操作：query(...) ;
        // 更新操作：update() ;
        Long count = qr.query(sql, new ScalarHandler<Long>());
        System.out.println(count);
    }

    // 查询所有 - BeanListHandler
    private static void testQueryAll() throws SQLException{
        // 第一：通过C3P0/DBCP获取数据源对象 -- C3P0Util
        // 第二：创建QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()) ;

        // 第三：定义要操作的SQL语句  -- 使用别名解决实体对象属性名和数据表字段名不一致的问题
        String sql = "select product_id as id,product_name as name,product_price as price,product_count as count,product_image as image,product_desc as `desc` from product" ;

        // 第四：定义SQL语句需要的具体数据
        // 第五：执行SQL语句 - 反射、封装处理...
        // 查询操作：query(...) ;
        // 更新操作：update() ;
        List<Product> list = qr.query(sql, new BeanListHandler<Product>(Product.class));


        for(Product p : list) {
            // 输出对象，默认会调用 toString()方法
            System.out.println(p);
        }
    }


    public static void main(String[] args) throws SQLException {
        testCount() ;
    }
}
